'Vermis Bicerebrus
'The two-headed worm
'A multibot by Bacillus
'Two heads coordinate themselves so one end pulls stronger than the other and the other
'co-operates if it feels it is being pulled too much
'Uses poison and shell
'Body bits' aim is still a bit odd

'Body vars-tail is obsolete
def head 0
def bodyp 5
def tail 10

'Minimum body level to be sustained
def blevel 200
'Maximium velocity
def maxv 40
'Velocity to sustain, be it forwards or backwards
def mvel 42

'INIT-form tie to parent
'    -conspec
'    'set sustained velocity
cond
  *.robage 0 =
start
  69 .out1 store
  69 .tout1 store
  .tie inc
  .maxv rnd ++ .mvel store
stop

'Clear worm ID if single cell
cond
  *.numties 0 =
start
  .out3 store .tout3 store
stop

'Set worm ID
cond
  *.tout3 0 =
  *.numties 0 >
  *.tin3 0 =
start
  -32000 32000 rnd dup .out3 store .tout3 store
stop

'Copy worm ID
cond
  *.tout3 0 =
  *.numties 0 > and
  *.tin3 0 != and
  *.numties 0 >
  *.tin3 *.tout3 > and or
start
  *.tin3 dup .tout3 store .out3 store
stop

'Update-Antivirus system
'      -Anti-manipulations
'      -Make shell
'      -Body maintenance
start
  *.mkvirus .delgene store
  .backshot store
  *.tout2 *.shell sub .mkshell store
  .fixpos store
  .blevel *.totalmyspecies 10 mult add *.body sub dup .strbody store - .fdbody store
stop

'Less than 2 ties = head
cond
  *.numties 2 <
start
  .head dup .out2 store .tout2 store
  *.mvel abs .mvel store
stop

'2 ties = body part
cond
  *.numties 2 =
start
  .bodyp dup .out2 store .tout2 store
stop

'Too much strain, change direction
cond
  *.out2 .head =
  *.velup *.mvel sgn mult 0 <=
  *.in1 *.out1 !=
start
  *.mvel - .mvel store
stop

'Head Update-Fix eyes
'           -Move tie out of the way
'           -Fix shot
'           -Set speed
'           -OCULUS II
cond
  *.out2 .head =
start
  .eye5dir store
  628 .fixang store
  .aimshoot store
  *.mvel *.eye5 sgn 10 mult add *.velup sub .up store
  -4 *.eye1 *.eye9 sub sgn 0 floor mult *.eye1 *.eye8 sub sgn 0 floor mult *.eye1 *.eye7 sub sgn 0    floor mult *.eye1 *.eye6 sub sgn 0 floor mult *.eye1 *.eye5 sub sgn 0 floor mult *.eye1 *.eye4 sub   sgn 0 floor mult *.eye1 *.eye3 sub sgn 0 floor mult *.eye1 *.eye2 sub sgn 0 floor mult 4 *.eye9     *.eye8 sub sgn 0 floor mult *.eye9 *.eye7 sub sgn 0 floor mult *.eye9 *.eye6 sub sgn 0 floor mult
  *.eye9 *.eye5 sub sgn 0 floor mult *.eye9 *.eye4 sub sgn 0 floor mult *.eye9 *.eye3 sub sgn 0 floor  mult *.eye9 *.eye2 sub sgn 0 floor mult *.eye9 *.eye1 sub sgn ++ sgn mult add -3 *.eye2 *.eye9 sub   sgn ++ sgn mult *.eye2 *.eye8 sub sgn 0 floor mult *.eye2 *.eye7 sub sgn 0 floor mult *.eye2 *.eye6  sub sgn 0 floor mult *.eye2 *.eye5 sub sgn 0 floor mult *.eye2 *.eye4 sub sgn 0 floor mult *.eye2    *.eye3 sub sgn 0 floor mult *.eye2 *.eye1 sub sgn ++ sgn mult add 3 *.eye8 *.eye9 sub sgn ++ sgn     mult *.eye8 *.eye7 sub sgn 0 floor mult *.eye8 *.eye6 sub sgn 0 floor mult *.eye8 *.eye5 sub sgn 0   floor mult *.eye8 *.eye4 sub sgn 0 floor mult *.eye8 *.eye3 sub sgn 0 floor mult *.eye8 *.eye2 sub   sgn ++ sgn mult *.eye8 *.eye1 sub sgn ++ sgn mult add -2 *.eye3 *.eye9 sub sgn ++ sgn mult *.eye3    *.eye8 sub sgn ++ sgn mult *.eye3 *.eye7 sub sgn 0 floor mult *.eye3 *.eye6 sub sgn 0 floor mult
  *.eye3 *.eye5 sub sgn 0 floor mult *.eye3 *.eye4 sub sgn 0 floor mult *.eye3 *.eye2 sub sgn ++ sgn   mult *.eye3 *.eye1 sub sgn ++ sgn mult add 2 *.eye7 *.eye9 sub sgn ++ sgn mult *.eye7 *.eye8 sub     sgn ++ sgn mult *.eye7 *.eye7 sub sgn 0 floor mult *.eye7 *.eye6 sub sgn 0 floor mult *.eye7 *.eye5  sub sgn 0 floor mult *.eye7 *.eye4 sub sgn ++ sgn mult *.eye7 *.eye2 sub sgn ++ sgn mult *.eye7     *.eye1 sub sgn ++ sgn mult add -1 *.eye4 *.eye9 sub sgn ++ sgn mult *.eye4 *.eye8 sub sgn ++ sgn     mult *.eye4 *.eye7 sub sgn ++ sgn mult *.eye4 *.eye6 sub sgn 0 floor mult *.eye4 *.eye5 sub sgn 0    floor mult *.eye4 *.eye3 sub sgn ++ sgn mult *.eye4 *.eye2 sub sgn ++ sgn mult *.eye4 *.eye1 sub     sgn ++ sgn mult add 1 *.eye4 *.eye9 sub sgn ++ sgn mult *.eye4 *.eye8 sub sgn ++ sgn mult *.eye4    *.eye7 sub sgn ++ sgn mult *.eye4 *.eye6 sub sgn ++ sgn mult *.eye4 *.eye5 sub sgn 0 floor mult
  *.eye4 *.eye3 sub sgn ++ sgn mult *.eye4 *.eye2 sub sgn ++ sgn mult *.eye4 *.eye1 sub sgn ++ sgn     mult add 0 *.eye5 *.eye9 sub sgn ++ sgn mult *.eye5 *.eye8 sub sgn ++ sgn mult *.eye5 *.eye7 sub     sgn ++ sgn mult *.eye5 *.eye6 sub sgn ++ sgn mult *.eye5 *.eye4 sub sgn ++ sgn mult *.eye5 *.eye3   sub sgn ++ sgn mult *.eye5 *.eye2 sub sgn ++ sgn mult *.eye5 *.eye1 sub sgn ++ sgn mult add .focuseye store
stop

'Defense Mechanism-Make poison, take shell from others, wriggle around
cond
  *.shflav -1 =
  *.shflav -6 =
  or
start
  99 .shareshell store
  25 *.poison sub .mkpoison store
  .shoot .ploc store
  *.velup 1 rnd 2 mult -- mult .dx store
  .shflav store
stop

'Food sighted
cond
  *.out2 .head =
  *.in1 *.out1 !=
  *.eyef 0 >
start
  *.veldx .sx store
  *.refxpos *.refypos angle .setaim store
stop

'Use radar-eye if body part (Need to fix aimshoot)
cond
  *.out2 .bodyp =
start
  .focuseye store
  *.timer 314 mult 628 sub dup .eye5dir store .aimshoot store
  99 .sharewaste store
  25 *.shell sub .mkshell store
  *.trefvelmyup 5 sub floor .up store
stop

'Nrg sharing
'In pulses to localize death by lack of nrg
cond
  *.timer 25 mod 0 =
start
  50 .sharenrg store
stop

'Body parts shed waste
cond
  *.out2 .bodyp =
  *.waste 50 >=
start
  *.waste .shootval store
  -4 .shoot store
stop

'Attack food
cond
  *.in1 *.out1 !=
  *.eyef 30 >
  *.refnrg 0 >
start
  16 .shootval store
  -1 .shoot store
  *.velup .dn *.out2 .head sub sgn abs -- abs mult store
  *.hitup .fixpos store
stop

'Make tie between two single cells
cond
  *.out2 .head =
  *.in2 .head =
  *.in1 *.out1 =
  *.in3 0 =
  *.out3 0 =
start
  .tie inc
stop

'Delete excess/foreign ties
cond
  *.tin1 *.tout1 !=
  *.numties 2 > or
start
  *.tiepres .deltie store
stop

'Grow
cond
  *.nrg *.body 10 mult 5000 floor >
  *.eye5 30 <
  *.out2 .head =
start
  50 .repro store
stop